package bean.dao;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import hbt.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import bean.Usuario;

public class HibernateCuentasDAO {
	private static HibernateCuentasDAO instancia = null;
	private static SessionFactory sf = null;

	public static HibernateCuentasDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateCuentasDAO();
		} 
		return instancia;
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> cuentasDeUsuarios(){
		Session session = sf.openSession();
		
		List<Object[]> lista = session.createQuery(
				"select C , U from Cuenta C join C.usuarios U")
				.list();
	
		session.close();
		return lista;
	}
	
	@SuppressWarnings("rawtypes")
	public Set<Usuario> usuariosConTelefonos(){
		Session session = sf.openSession();
				
		Iterator ilista = session.createQuery(
				"select U, T from Usuario U join U.telefonos T")
				.iterate();

		Set<Usuario> set = new HashSet<Usuario>();
        
		while(ilista.hasNext()){
			Object[] tupla = (Object[]) ilista.next();
			Usuario u = (Usuario) tupla[0];
			set.add(u);
		}
		
		session.close();
		return set;
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> parametros(List<String> lstnombres){
		Session session = sf.openSession();
	
		List<Object[]> lista = session.createQuery(
				"select U, C from Usuario U left join U.cuentas C " +
				"where U.nombre in(:nombres)")
				.setParameterList("nombres", lstnombres)
				.list(); 
		
		session.close();
		return lista;
	}
}
